package com.ouc.common.utils;


import org.apache.poi.ss.usermodel.FormulaEvaluator;

import java.io.*;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class TextUtils {

  private static FormulaEvaluator evaluator;  //  用于查看excel格式的

  /**
   * 通过输入流读取txt
   * 为了方便前端使用
   *
   * @param is       文件输入流
   * @param startRow 开始行数，从第startRow开始读取
   * @return
   */
  public static List<String> readTxt(InputStream is, Integer startRow) {
    List<String> data = new ArrayList<>();
    // 使用TryWithResource的语法糖，避免文件关闭繁琐
    try (BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
      //设置inputStreamReader的构造方法并创建对象设置编码方式为gbk(编码格式可自行切换
      for (int i = 0; i < startRow - 1; i++) {
        br.readLine();
      }
      String str;
      while ((str = br.readLine()) != null) {
        data.add(str);
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        is.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return data;
  }

  /**
   * 读取txt，从第flag行开始读取
   *
   * @param filePath TXT文件地址
   * @param startRow 开始行数，从第startRow行开始读取
   * @return list集合
   */
  public static List<String> readTxt(String filePath, Integer startRow) {
    List<String> data = new ArrayList<>();
    // 使用TryWithResource的语法糖，避免文件关闭繁琐
    try (InputStream is = new FileInputStream(filePath)) {
      data = readTxt(is, startRow);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return data;
  }

  /**
   * 重载方法，TXT全部读取
   *
   * @param filePath 文件路径
   * @return list集合
   */
  public static List<String> readTxt(String filePath) {
    return readTxt(filePath, 1);
  }

  /**
   * 传入String类型进行写入，写入成功返回true，否则返回false
   *
   * @param content  要写入的内容
   * @param filePath 文件路径
   * @return true/false
   */
  public static Boolean txtWrite(String content, String filePath) {
    File file = new File(filePath);
    if (!file.getParentFile().exists()) {
      file.mkdirs();
    }
    Boolean flag = false;
    try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
      bw.write(content);
      flag = true;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return flag;
  }

  /**
   * 进行写入文件，如果不传递文件保存路径，会保存到当前项目下
   *
   * @param content 文件内容
   * @return true/false
   */
  public static Boolean txtWrite(String content) {
    String filePath = System.getProperty("user.dir");
    return txtWrite(content, filePath);
  }

  /**
   * 日期格式转换
   *
   * @param date   传入日期
   * @param format 日期格式
   * @return String
   */
  private static String Date2Str(Date date, String format) {
    // Date -> LocalDateTime -> String
    DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
    ZoneId zone = ZoneId.systemDefault();
    LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), zone);
    return df.format(localDateTime);
  }

  /**
   * 读取文件并进行写入
   * 使用输入输出流可以提高性能
   *
   * @param srcPath  被读取的文件
   * @param destPath 被写入的文件
   */
  public static void readAndWrite(String srcPath, String destPath) {
    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(srcPath)));
         final BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(destPath)))) {
      byte[] buffer = new byte[1024];
      int len;
      while ((len = bis.read(buffer)) != -1) {
        bos.write(buffer, 0, len);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
